Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / androidApp / src / fdroid / java / org / meshtastic / app / map / cluster / RadiusMarkerClusterer.java

Displaying Raw • Download

androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java fix/metrics-lazycolumn-duplicate-key-crash (55432cff) Text, 8.18 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787org.meshtastic.app.map.clusterTb4b4b4;

Tff7b72import T7ee787android.content.ContextTb4b4b4;
Tff7b72import T7ee787android.graphics.BitmapTb4b4b4;
Tff7b72import T7ee787android.graphics.CanvasTb4b4b4;
Tff7b72import T7ee787android.graphics.ColorTb4b4b4;
Tff7b72import T7ee787android.graphics.PaintTb4b4b4;
Tff7b72import T7ee787android.graphics.RectTb4b4b4;
Tff7b72import T7ee787android.graphics.drawable.BitmapDrawableTb4b4b4;
Tff7b72import T7ee787android.graphics.drawable.DrawableTb4b4b4;
Tff7b72import T7ee787android.view.MotionEventTb4b4b4;

Tff7b72import T7ee787androidx.core.content.res.ResourcesCompatTb4b4b4;

Tff7b72import T7ee787org.meshtastic.app.map.model.MarkerWithLabelTb4b4b4;

Tff7b72import T7ee787org.osmdroid.bonuspack.RTb4b4b4;
Tff7b72import T7ee787org.osmdroid.util.BoundingBoxTb4b4b4;
Tff7b72import T7ee787org.osmdroid.util.GeoPointTb4b4b4;
Tff7b72import T7ee787org.osmdroid.views.MapViewTb4b4b4;

Tff7b72import T7ee787java.util.ArrayListTb4b4b4;
Tff7b72import T7ee787java.util.IteratorTb4b4b4;

T8b949e/**
* Radius-based Clustering algorithm:
* create a cluster using the first point from the cloned list.
* All points that are found within the neighborhood are added to this cluster.
* Then all the neighbors and the main point are removed from the list of points.
* It continues until the list is empty.
*
* Largely inspired from GridMarkerClusterer by M.Kergall
*
* @author sidorovroman92@gmail.com
*/

Tff7b72public Tff7b72class T56d364RadiusMarkerClusterer Tff7b72extends Te6edf3MarkerClusterer Tb4b4b4{

Tff7b72protected Tffa657int Te6edf3mMaxClusteringZoomLevel Tff7b72= T79c0ff7Tb4b4b4;
Tff7b72protected Tffa657int Te6edf3mRadiusInPixels Tff7b72= T79c0ff100Tb4b4b4;
Tff7b72protected Tffa657double Te6edf3mRadiusInMetersTb4b4b4;
Tff7b72protected Te6edf3Paint Te6edf3mTextPaintTb4b4b4;
Tff7b72private Te6edf3ArrayListTff7b72<Te6edf3MarkerWithLabelTff7b72> Te6edf3mClonedMarkersTb4b4b4;
Tff7b72protected Tffa657boolean Te6edf3mAnimatedTb4b4b4;
Tffa657int Te6edf3mDensityDpiTb4b4b4;

T8b949e/** cluster icon anchor */
Tff7b72public Tffa657float Te6edf3mAnchorU Tff7b72= Te6edf3MarkerWithLabelTb4b4b4.Te6edf3ANCHOR_CENTERTb4b4b4, Te6edf3mAnchorV Tff7b72= Te6edf3MarkerWithLabelTb4b4b4.Te6edf3ANCHOR_CENTERTb4b4b4;
T8b949e/** anchor point to draw the number of markers inside the cluster icon */
Tff7b72public Tffa657float Te6edf3mTextAnchorU Tff7b72= Te6edf3MarkerWithLabelTb4b4b4.Te6edf3ANCHOR_CENTERTb4b4b4, Te6edf3mTextAnchorV Tff7b72= Te6edf3MarkerWithLabelTb4b4b4.Te6edf3ANCHOR_CENTERTb4b4b4;

Tff7b72public Td2a8ffRadiusMarkerClustererTb4b4b4(Te6edf3Context Te6edf3ctxTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3mTextPaint Tff7b72= Tff7b72new Te6edf3PaintTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3mTextPaintTb4b4b4.Te6edf3setColorTb4b4b4(Te6edf3ColorTb4b4b4.Te6edf3WHITETb4b4b4)Tb4b4b4;
Te6edf3mTextPaintTb4b4b4.Te6edf3setTextSizeTb4b4b4(T79c0ff15 Tff7b72* Te6edf3ctxTb4b4b4.Te6edf3getResourcesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getDisplayMetricsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3densityTb4b4b4)Tb4b4b4;
Te6edf3mTextPaintTb4b4b4.Te6edf3setFakeBoldTextTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3mTextPaintTb4b4b4.Te6edf3setTextAlignTb4b4b4(Te6edf3PaintTb4b4b4.Te6edf3AlignTb4b4b4.Te6edf3CENTERTb4b4b4)Tb4b4b4;
Te6edf3mTextPaintTb4b4b4.Te6edf3setAntiAliasTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3Drawable Te6edf3clusterIconD Tff7b72= Te6edf3ResourcesCompatTb4b4b4.Te6edf3getDrawableTb4b4b4(Te6edf3ctxTb4b4b4.Te6edf3getResourcesTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3marker_clusterTb4b4b4, Te6edf3ctxTb4b4b4.Te6edf3getThemeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bitmap Te6edf3clusterIcon Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3BitmapDrawableTb4b4b4) Te6edf3clusterIconDTb4b4b4)Tb4b4b4.Te6edf3getBitmapTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3setIconTb4b4b4(Te6edf3clusterIconTb4b4b4)Tb4b4b4;
Te6edf3mAnimated Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3mDensityDpi Tff7b72= Te6edf3ctxTb4b4b4.Te6edf3getResourcesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getDisplayMetricsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3densityDpiTb4b4b4;
Tb4b4b4}

T8b949e/** If you want to change the default text paint (color, size, font) */
Tff7b72public Te6edf3Paint Td2a8ffgetTextPaintTb4b4b4(Tb4b4b4)Tb4b4b4{
Tff7b72return Te6edf3mTextPaintTb4b4b4;
Tb4b4b4}

T8b949e/** Set the radius of clustering in pixels. Default is 100px. */
Tff7b72public Tffa657void Td2a8ffsetRadiusTb4b4b4(Tffa657int Te6edf3radiusTb4b4b4)Tb4b4b4{
Te6edf3mRadiusInPixels Tff7b72= Te6edf3radiusTb4b4b4;
Tb4b4b4}

T8b949e/** Set max zoom level with clustering. When zoom is higher or equal to this level, clustering is disabled.
* You can put a high value to disable this feature. */
Tff7b72public Tffa657void Td2a8ffsetMaxClusteringZoomLevelTb4b4b4(Tffa657int Te6edf3zoomTb4b4b4)Tb4b4b4{
Te6edf3mMaxClusteringZoomLevel Tff7b72= Te6edf3zoomTb4b4b4;
Tb4b4b4}

T8b949e/** Radius-Based clustering algorithm */
Tf0883e@Override Tff7b72public Te6edf3ArrayListTff7b72<Te6edf3StaticClusterTff7b72> Td2a8ffclustererTb4b4b4(Te6edf3MapView Te6edf3mapViewTb4b4b4) Tb4b4b4{

Te6edf3ArrayListTff7b72<Te6edf3StaticClusterTff7b72> Te6edf3clusters Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Te6edf3StaticClusterTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3convertRadiusToMetersTb4b4b4(Te6edf3mapViewTb4b4b4)Tb4b4b4;

Te6edf3mClonedMarkers Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Te6edf3MarkerWithLabelTff7b72>Tb4b4b4(Te6edf3mItemsTb4b4b4)Tb4b4b4; T8b949e//shallow copy
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3mClonedMarkersTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MarkerWithLabel Te6edf3m Tff7b72= Te6edf3mClonedMarkersTb4b4b4.Te6edf3getTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3StaticCluster Te6edf3cluster Tff7b72= Te6edf3createClusterTb4b4b4(Te6edf3mTb4b4b4, Te6edf3mapViewTb4b4b4)Tb4b4b4;
Te6edf3clustersTb4b4b4.Te6edf3addTb4b4b4(Te6edf3clusterTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3clustersTb4b4b4;
Tb4b4b4}

Tff7b72private Te6edf3StaticCluster Td2a8ffcreateClusterTb4b4b4(Te6edf3MarkerWithLabel Te6edf3mTb4b4b4, Te6edf3MapView Te6edf3mapViewTb4b4b4) Tb4b4b4{
Te6edf3GeoPoint Te6edf3clusterPosition Tff7b72= Te6edf3mTb4b4b4.Te6edf3getPositionTb4b4b4(Tb4b4b4)Tb4b4b4;

Te6edf3StaticCluster Te6edf3cluster Tff7b72= Tff7b72new Te6edf3StaticClusterTb4b4b4(Te6edf3clusterPositionTb4b4b4)Tb4b4b4;
Te6edf3clusterTb4b4b4.Te6edf3addTb4b4b4(Te6edf3mTb4b4b4)Tb4b4b4;

Te6edf3mClonedMarkersTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3mTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3mapViewTb4b4b4.Te6edf3getZoomLevelTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3mMaxClusteringZoomLevelTb4b4b4) Tb4b4b4{
T8b949e//above max level => block clustering:
Tff7b72return Te6edf3clusterTb4b4b4;
Tb4b4b4}
Te6edf3IteratorTff7b72<Te6edf3MarkerWithLabelTff7b72> Te6edf3it Tff7b72= Te6edf3mClonedMarkersTb4b4b4.Te6edf3iteratorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3itTb4b4b4.Te6edf3hasNextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MarkerWithLabel Te6edf3neighbor Tff7b72= Te6edf3itTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657double Te6edf3distance Tff7b72= Te6edf3clusterPositionTb4b4b4.Te6edf3distanceToAsDoubleTb4b4b4(Te6edf3neighborTb4b4b4.Te6edf3getPositionTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3distance Tff7b72<Tff7b72= Te6edf3mRadiusInMetersTb4b4b4) Tb4b4b4{
Te6edf3clusterTb4b4b4.Te6edf3addTb4b4b4(Te6edf3neighborTb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4.Te6edf3removeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3clusterTb4b4b4;
Tb4b4b4}

Tf0883e@Override Tff7b72public Te6edf3MarkerWithLabel Td2a8ffbuildClusterMarkerTb4b4b4(Te6edf3StaticCluster Te6edf3clusterTb4b4b4, Te6edf3MapView Te6edf3mapViewTb4b4b4) Tb4b4b4{
Te6edf3MarkerWithLabel Te6edf3m Tff7b72= Tff7b72new Te6edf3MarkerWithLabelTb4b4b4(Te6edf3mapViewTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3mTb4b4b4.Te6edf3setPositionTb4b4b4(Te6edf3clusterTb4b4b4.Te6edf3getPositionTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3mTb4b4b4.Te6edf3setInfoWindowTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3mTb4b4b4.Te6edf3setAnchorTb4b4b4(Te6edf3mAnchorUTb4b4b4, Te6edf3mAnchorVTb4b4b4)Tb4b4b4;

Te6edf3Bitmap Te6edf3finalIcon Tff7b72= Te6edf3BitmapTb4b4b4.Te6edf3createBitmapTb4b4b4(Te6edf3mClusterIconTb4b4b4.Te6edf3getScaledWidthTb4b4b4(Te6edf3mDensityDpiTb4b4b4)Tb4b4b4,
Te6edf3mClusterIconTb4b4b4.Te6edf3getScaledHeightTb4b4b4(Te6edf3mDensityDpiTb4b4b4)Tb4b4b4, Te6edf3mClusterIconTb4b4b4.Te6edf3getConfigTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Canvas Te6edf3iconCanvas Tff7b72= Tff7b72new Te6edf3CanvasTb4b4b4(Te6edf3finalIconTb4b4b4)Tb4b4b4;
Te6edf3iconCanvasTb4b4b4.Te6edf3drawBitmapTb4b4b4(Te6edf3mClusterIconTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3String Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72+ Te6edf3clusterTb4b4b4.Te6edf3getSizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3textHeight Tff7b72= Tb4b4b4(Tffa657intTb4b4b4) Tb4b4b4(Te6edf3mTextPaintTb4b4b4.Te6edf3descentTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3mTextPaintTb4b4b4.Te6edf3ascentTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3iconCanvasTb4b4b4.Te6edf3drawTextTb4b4b4(Te6edf3textTb4b4b4,
Te6edf3mTextAnchorU Tff7b72* Te6edf3finalIconTb4b4b4.Te6edf3getWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3mTextAnchorV Tff7b72* Te6edf3finalIconTb4b4b4.Te6edf3getHeightTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3textHeight Tff7b72/ T79c0ff2Tb4b4b4,
Te6edf3mTextPaintTb4b4b4)Tb4b4b4;
Te6edf3mTb4b4b4.Te6edf3setIconTb4b4b4(Tff7b72new Te6edf3BitmapDrawableTb4b4b4(Te6edf3mapViewTb4b4b4.Te6edf3getContextTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getResourcesTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3finalIconTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3mTb4b4b4;
Tb4b4b4}

Tf0883e@Override Tff7b72public Tffa657void Td2a8ffrendererTb4b4b4(Te6edf3ArrayListTff7b72<Te6edf3StaticClusterTff7b72> Te6edf3clustersTb4b4b4, Te6edf3Canvas Te6edf3canvasTb4b4b4, Te6edf3MapView Te6edf3mapViewTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3StaticCluster Te6edf3cluster Tb4b4b4: Te6edf3clustersTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3clusterTb4b4b4.Te6edf3getSizeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
T8b949e//cluster has only 1 marker => use it as it is:
Te6edf3clusterTb4b4b4.Te6edf3setMarkerTb4b4b4(Te6edf3clusterTb4b4b4.Te6edf3getItemTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e//only draw 1 Marker at Cluster center, displaying number of Markers contained
Te6edf3MarkerWithLabel Te6edf3m Tff7b72= Te6edf3buildClusterMarkerTb4b4b4(Te6edf3clusterTb4b4b4, Te6edf3mapViewTb4b4b4)Tb4b4b4;
Te6edf3clusterTb4b4b4.Te6edf3setMarkerTb4b4b4(Te6edf3mTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffconvertRadiusToMetersTb4b4b4(Te6edf3MapView Te6edf3mapViewTb4b4b4) Tb4b4b4{

Te6edf3Rect Te6edf3mScreenRect Tff7b72= Te6edf3mapViewTb4b4b4.Te6edf3getIntrinsicScreenRectTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;

Tffa657int Te6edf3screenWidth Tff7b72= Te6edf3mScreenRectTb4b4b4.Te6edf3right Tff7b72- Te6edf3mScreenRectTb4b4b4.Te6edf3leftTb4b4b4;
Tffa657int Te6edf3screenHeight Tff7b72= Te6edf3mScreenRectTb4b4b4.Te6edf3bottom Tff7b72- Te6edf3mScreenRectTb4b4b4.Te6edf3topTb4b4b4;

Te6edf3BoundingBox Te6edf3bb Tff7b72= Te6edf3mapViewTb4b4b4.Te6edf3getBoundingBoxTb4b4b4(Tb4b4b4)Tb4b4b4;

Tffa657double Te6edf3diagonalInMeters Tff7b72= Te6edf3bbTb4b4b4.Te6edf3getDiagonalLengthInMetersTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657double Te6edf3diagonalInPixels Tff7b72= Te6edf3MathTb4b4b4.Te6edf3sqrtTb4b4b4(Te6edf3screenWidth Tff7b72* Te6edf3screenWidth Tff7b72+ Te6edf3screenHeight Tff7b72* Te6edf3screenHeightTb4b4b4)Tb4b4b4;
Tffa657double Te6edf3metersInPixel Tff7b72= Te6edf3diagonalInMeters Tff7b72/ Te6edf3diagonalInPixelsTb4b4b4;

Te6edf3mRadiusInMeters Tff7b72= Te6edf3mRadiusInPixels Tff7b72* Te6edf3metersInPixelTb4b4b4;
Tb4b4b4}

Tff7b72public Tffa657void Td2a8ffsetAnimationTb4b4b4(Tffa657boolean Te6edf3animateTb4b4b4)Tb4b4b4{
Te6edf3mAnimated Tff7b72= Te6edf3animateTb4b4b4;
Tb4b4b4}

Tff7b72public Tffa657void Td2a8ffzoomOnClusterTb4b4b4(Te6edf3MapView Te6edf3mapViewTb4b4b4, Te6edf3StaticCluster Te6edf3clusterTb4b4b4)Tb4b4b4{
Te6edf3BoundingBox Te6edf3bb Tff7b72= Te6edf3clusterTb4b4b4.Te6edf3getBoundingBoxTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bbTb4b4b4.Te6edf3getLatNorthTb4b4b4(Tb4b4b4)Tff7b72!Tff7b72=Te6edf3bbTb4b4b4.Te6edf3getLatSouthTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3bbTb4b4b4.Te6edf3getLonEastTb4b4b4(Tb4b4b4)Tff7b72!Tff7b72=Te6edf3bbTb4b4b4.Te6edf3getLonWestTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3bb Tff7b72= Te6edf3bbTb4b4b4.Te6edf3increaseByScaleTb4b4b4(T79c0ff2.3fTb4b4b4)Tb4b4b4;
Te6edf3mapViewTb4b4b4.Te6edf3zoomToBoundingBoxTb4b4b4(Te6edf3bbTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else T8b949e//all points exactly at the same place:
Te6edf3mapViewTb4b4b4.Te6edf3setExpectedCenterTb4b4b4(Te6edf3bbTb4b4b4.Te6edf3getCenterWithDateLineTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override Tff7b72public Tffa657boolean Td2a8ffonSingleTapConfirmedTb4b4b4(Tff7b72final Te6edf3MotionEvent Te6edf3eventTb4b4b4, Tff7b72final Te6edf3MapView Te6edf3mapViewTb4b4b4)Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72final Te6edf3StaticCluster Te6edf3cluster Tb4b4b4: Te6edf3reversedClustersTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3clusterTb4b4b4.Te6edf3getMarkerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3onSingleTapConfirmedTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3mapViewTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3mAnimated Tff7b72&Tff7b72& Te6edf3clusterTb4b4b4.Te6edf3getSizeTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff1Tb4b4b4)
Te6edf3zoomOnClusterTb4b4b4(Te6edf3mapViewTb4b4b4, Te6edf3clusterTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s